package visiopuce.service.document;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;

import visiopuce.ApplicationContexte;
import visiopuce.objets.Analyse;
import visiopuce.objets.Champ;
import visiopuce.objets.Personne;
import visiopuce.objets.Phenotype;
import visiopuce.objets.Prelevement;
import visiopuce.objets.Resultat;
import visiopuce.objets.Utilisateur;
import visiopuce.service.AnalyseServiceImpl;
import visiopuce.service.PersonneServiceImpl;
import visiopuce.service.PrelevementServiceImpl;
import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;

public class ResultatFISHNonPuce {

	public String createDocument(Resultat r) {
		String nomFichierout = "";
		try {
			boolean creer = true;
			InputStream in = new FileInputStream(new File(ApplicationContexte.REPERTOIRE_MODEL + "resulatFISHNonPuce.docx"));
			IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, TemplateEngineKind.Velocity);
			Analyse analyse = AnalyseServiceImpl.getInstance().getAnalyseByIdAnalyse(r.getAnalyse().getIdAnalyse());
			Prelevement prelevement = PrelevementServiceImpl.getInstance().getPrelevementById(analyse.getPrelevement().getIdPrelevement());
			Personne personne = PersonneServiceImpl.getInstance().getPersonneById(prelevement.getPersonne().getIdPersonne());
			SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");

			String repResultat = "";
			if (Character.isDigit(prelevement.getNumeroPrelevement().charAt(1))) {
				repResultat = ApplicationContexte.REPERTOIRE_RESULTAT+"activité 20"+prelevement.getNumeroPrelevement().substring(1,3)+"\\"+prelevement.getNumeroPrelevement().substring(0,1)+"\\";
			} else {
				if (Character.isDigit(prelevement.getNumeroPrelevement().charAt(2))) {
					repResultat = ApplicationContexte.REPERTOIRE_RESULTAT+"activité 20"+prelevement.getNumeroPrelevement().substring(2,4)+"\\"+prelevement.getNumeroPrelevement().substring(0,2)+"\\";
				}	
			}
			
			// 2) Create Java model context
			IContext context = report.createContext();
			context.put("personne", personne);
			context.put("dateNaissance", formatter.format(personne.getDateNaissance()));
			context.put("dateRendu", formatter.format(new Date()));
			if (prelevement.getDateReception() == null) {
				context.put("dateReception", formatter.format(prelevement.getDatePrelevement()));
			} else {
				context.put("dateReception", formatter.format(prelevement.getDateReception()));
			}
			context.put("prelevement", prelevement);
			context.put("resultat", r);
			context.put("analyse", analyse);
			String indication = "";
			if (prelevement.getIndication() == null || prelevement.getIndication().getLibelle().equals("non renseigné")) {
				indication = "L'INDICATION N'A PAS ETE ENTREE";
			} else {
				if (!prelevement.getIndication().getLibelle().contains("utre")) {
					indication = prelevement.getIndication().getLibelle() + " - ";
				}
				Champ ctSigneAppel = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tSigneAppel", "Prel-" + prelevement.getIdPrelevement());
				if (prelevement.getIndication().getLibelle().contains("ignes d'appel")) {
					if (ctSigneAppel != null) {
						indication = "Signes d'appel échographique : " + ctSigneAppel.getValeur() + " - ";
					}
				} else {
					if (ctSigneAppel != null) {
						indication += "signes d'appel échographique : " + ctSigneAppel.getValeur() + " - ";
					}
				}
				if (personne.getPhenotype() != null) {
					indication += personne.getPhenotype() + " - ";
				}
				ArrayList<Phenotype> pheno = PersonneServiceImpl.getInstance().getPhenotypesByIdPersonne(personne.getIdPersonne());
				if (pheno != null) {
					for (Phenotype phenotype : pheno) {
						if (!indication.toLowerCase().contains(phenotype.getLibelle().toLowerCase())) {
							indication += phenotype.getLibelle() + " - ";
						}
					}
				}

			}

			context.put("indication", indication.substring(0,indication.length()-3)+".");
			Champ ctMotifFish = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tMotifFish", "Ana-" + analyse.getIdAnalyse());
			if (ctMotifFish != null) {
				context.put("motif", ctMotifFish.getValeur());
			}
			
			Champ ctSondeFish = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tSondeFish", "Ana-" + analyse.getIdAnalyse());
			if (ctSondeFish != null) {
				context.put("sondes", ctSondeFish.getValeur());
			}
			Champ ctNbMitoseFish = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tNbMitoseFish", "Ana-" + analyse.getIdAnalyse());
			Champ ctNbNoyauxFish = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tNbNoyauxFish", "Ana-" + analyse.getIdAnalyse());
			if (ctNbMitoseFish != null && ctNbNoyauxFish != null) {
				context.put("analyses", "Analyse en interfaces et mitoses\r\nNombre de mitoses analysées\t:" + ctNbMitoseFish.getValeur() + "\r\nNombre de noyaux analysées\t:" + ctNbNoyauxFish.getValeur() + "\r\n");
			} else {
				if (ctNbNoyauxFish != null) {
					context.put("analyses", "Analyse en interfaces\r\nNombre de noyaux analysées\t:" + ctNbNoyauxFish.getValeur() + "\r\n");
				}
				if (ctNbMitoseFish != null) {
					context.put("analyses", "Analyse en mitoses\r\nNombre de mitoses analysées\t:" + ctNbMitoseFish.getValeur() + "\r\n");
				}
			}

			
			if (analyse.getDateTechnique() == null) {
				context.put("dateHybridation", formatter.format(analyse.getDateTechnique()));
			} else {
				context.put("dateHybridation", "Non connue");
			}
			
			
			
			

			if (prelevement.getPrescripteur() != null) {
				context.put("prescripteur", prelevement.getPrescripteur());
				File fileout = new File(repResultat + prelevement.getNumeroPrelevement() + "_" + personne.getNom() + "_" + personne.getPrenom() + "_fish" + r.getAnalyse().getIdAnalyse() +  "_resultat" + r.getIdResultat() + "_" + formatter.format(new Date()) + "_"
						+ prelevement.getPrescripteur().getNom() + ".docx");
				if (fileout.exists()) {
					creer = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Fichier existant", "Le fichier " + fileout.getName() + " existe déjà souhaitez vous l'écraser?");
				}
				if (creer) {
					fileout.setWritable(true);
					OutputStream out = new FileOutputStream(fileout);
					report.process(context, out);
					if (fileout.exists()) {
						nomFichierout += fileout.getName() + "#";
					}
				}
			}
			if (prelevement.getPrescripteur2() != null) {
				context.put("prescripteur", prelevement.getPrescripteur2());
				boolean creer2 = true;
				File fileout2 = new File(repResultat + prelevement.getNumeroPrelevement() + "_" + personne.getNom() + "_" + personne.getPrenom() + "_fish" + r.getAnalyse().getIdAnalyse() +  "_resultat" + r.getIdResultat() + "_" +formatter.format(new Date()) + "_"
						+ prelevement.getPrescripteur2().getNom() + ".docx");
				if (fileout2.exists()) {
					creer2 = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Fichier existant", "Le fichier " + fileout2.getName() + " existe déjà souhaitez vous l'écraser?");
				}
				if (creer2) {
					fileout2.setWritable(true);
					OutputStream out2 = new FileOutputStream(fileout2);
					report.process(context, out2);
					
					if (fileout2.exists()) {
						nomFichierout += fileout2.getName() + "#";
					}
				}
			}

			if (prelevement.getPrescripteur3() != null) {
				context.put("prescripteur", prelevement.getPrescripteur3());
				boolean creer3 = true;
				File fileout3 = new File(repResultat + prelevement.getNumeroPrelevement() + "_" + personne.getNom() + "_" + personne.getPrenom() + "_fish" + r.getAnalyse().getIdAnalyse() +  "_resultat" + r.getIdResultat() + "_" + formatter.format(new Date()) + "_"
						+ prelevement.getPrescripteur3().getNom() + ".docx");
				if (fileout3.exists()) {
					creer3 = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Fichier existant", "Le fichier " + fileout3.getName() + " existe déjà souhaitez vous l'écraser?");
				}
				if (creer3) {
					fileout3.setWritable(true);
					OutputStream out3 = new FileOutputStream(fileout3);
					report.process(context, out3);
					if (fileout3.exists()) {
						nomFichierout += fileout3.getName() + "#";
					}
				}
			}

			if (prelevement.getNomPrenomAutrePresc() != null && !prelevement.getNomPrenomAutrePresc().isEmpty()) {
				boolean creer4 = true;
				File fileout4 = new File(repResultat + prelevement.getNumeroPrelevement() + "_" + personne.getNom() + "_" + personne.getPrenom() + "_fish" + r.getAnalyse().getIdAnalyse() +  "_resultat" + r.getIdResultat() + "_" + formatter.format(new Date()) + "_" + prelevement.getNomPrenomAutrePresc()
						+ ".docx");
				if (fileout4.exists()) {
					creer4 = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Fichier existant", "Le fichier " + fileout4.getName() + " existe déjà souhaitez vous l'écraser?");
				}
				if (creer4) {
					Utilisateur prescAutre = new Utilisateur();
					prescAutre.setNom(prelevement.getNomPrenomAutrePresc());
					prescAutre.setPrenom("");
					prescAutre.setAdresse("A compléter");
					context.put("prescripteur", prescAutre);
					fileout4.setWritable(true);
					OutputStream out4 = new FileOutputStream(fileout4);
					report.process(context, out4);
					if (fileout4.exists()) {
						nomFichierout += fileout4.getName() + "#";
					}
				}
			}
			in.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XDocReportException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return nomFichierout;
	}
}
